package org.example;

import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import java.io.FileOutputStream;
import java.io.IOException;

public class ExcelLargeFileExample {

    public static void main(String[] args) {
        // 1. 创建工作簿（使用SXSSF实现流式写入）
        Workbook workbook = new SXSSFWorkbook();

        try {
            // 2. 创建工作表并设置内存窗口大小（可选）
            Sheet sheet = workbook.createSheet("大量数据");
            ((SXSSFSheet) sheet).setRandomAccessWindowSize(100); // 保留最近100行在内存

            // 3. 模拟写入10万行数据
            System.out.println("开始写入数据...");
            for (int i = 0; i < 100000; i++) {
                Row row = sheet.createRow(i);
                row.createCell(0).setCellValue("第 " + (i + 1) + " 行");

                // 每写入1万行打印进度（可选）
                if (i > 0 && i % 10000 == 0) {
                    System.out.println("已写入 " + i + " 行...");
                }
            }

            // 4. 写入文件
            try (FileOutputStream out = new FileOutputStream("大数据.xlsx")) {
                workbook.write(out);
            }
            System.out.println("大数据.xlsx 写入完成！");

        } catch (IOException e) {
            System.err.println("写入Excel时出错: " + e.getMessage());
            e.printStackTrace();
        } finally {
            // 5. 清理临时文件
            if (workbook instanceof SXSSFWorkbook) {
                ((SXSSFWorkbook) workbook).dispose();
            }
            try {
                workbook.close();
            } catch (IOException e) {
                System.err.println("关闭工作簿时出错: " + e.getMessage());
            }
        }
    }
}